class VuplexPolyfill { constructor() { this._listeners = {}; window.addEventListener('message', this._handleWindowMessage.bind(this)); } addEventListener(eventName, listener) { if (!this._listeners[eventName]) { this._listeners[eventName] = []; } if (this._listeners[eventName].indexOf(listener) === -1) { this._listeners[eventName].push(listener); } } removeEventListener(eventName, listener) { if (!this._listeners[eventName]) { return; } const index = this._listeners[eventName].indexOf(listener); if (index !== -1) { this._listeners[eventName].splice(index, 1); } } postMessage(message) { // Don't pass a string to JSON.stringify() because it adds extra quotes. const messageString = typeof message === 'string' ? message : JSON.stringify(message); parent.postMessage({ type: 'vuplex.postMessage', message: messageString }, '*') } _emit(eventName, ...args) { if (!this._listeners[eventName]) { return; } for (const listener of this._listeners[eventName]) { try { listener(...args); } catch (error) { console.error(`An error occurred while invoking the '${eventName}' event handler.`, error); } } } _handleWindowMessage(event) { if (event.data && event.data.type === 'vuplex.postMessage') { this._emit('message', { data: event.data.message }); } }; } if (!window.vuplex) { window.vuplex = new VuplexPolyfill(); } if (window.vuplex) { vrAddMessageListener(); } else { window.addEventListener('vuplexready', vrAddMessageListener); } function vrAddMessageListener() { window.vuplex.addEventListener('message', function(event) { let json = event.data; if(typeof json === 'string') json = JSON.parse(json); // > JSON received: { "type": "greeting", "message": "Hello from C#!" } console.log('JSON received: '); console.log(json); let messageObject = { name: 'VR', //sender: json.sender, type: json.type, data: json.data || {}, }; document.querySelector('#game-frame').contentWindow.postMessage(messageObject, "*"); }); } let vrEvent = null; function VREvents() { this.receiveMessage = function() { window.addEventListener('message', EventHandler, false); function EventHandler(eventData) { if(eventData && eventData.data && eventData.data.name && eventData.data.name === 'VR') { let messageObject = { //sender: eventData.data.sender, type: eventData.data.type, data: eventData.data.data, }; //window.parent.postMessage(messageObject, '*'); window.vuplex.postMessage(messageObject, '*'); } else if(eventData && eventData.data && eventData.data.sender && eventData.data.sender === 'VR') { // let messageObject = { // name: 'VR', // sender: eventData.data.sender, // type: eventData.data.type, // data: eventData.data.data || {}, // }; // document.querySelector('#game-frame').contentWindow.postMessage(messageObject, "*"); } } }; } vrEvent = new VREvents(); vrEvent.receiveMessage();